package br.com.concretesolutions.canarinho.watcher;
import android.text.Editable;
import android.text.InputFilter;
import br.com.concretesolutions.canarinho.formatador.Formatador;
import br.com.concretesolutions.canarinho.validator.Validador;
import br.com.concretesolutions.canarinho.validator.ValidadorTelefone;
import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao;
/**
* {@link android.text.TextWatcher} responsável por formatar e validar um
* {@link android.widget.EditText} para telefones.
* Para usar este componente basta criar uma instância e chamar
* {@link android.widget.EditText#addTextChangedListener(android.text.TextWatcher)}.
*/
public final class TelefoneTextWatcher extends BaseCanarinhoTextWatcher {
private static final char[] TELEFONE_OITO_DIGITOS = "(##) ####-####".toCharArray();
private static final char[] TELEFONE_NOVE_DIGITOS = "(##) #####-####".toCharArray();
private static final InputFilter[] FILTRO_NOVE_DIGITOS = new InputFilter[]{
new InputFilter.LengthFilter(TELEFONE_NOVE_DIGITOS.length)};
private final Validador validador = ValidadorTelefone.getInstance();
private final Validador.ResultadoParcial resultadoParcial = new Validador.ResultadoParcial();
/**
* TODO Javadoc pendente
*
* @param callbackErros a descrever
*/
public TelefoneTextWatcher(EventoDeValidacao callbackErros) {
setEventoDeValidacao(callbackErros);
}
@Override
public void afterTextChanged(Editable s) {
if (isMudancaInterna()) {
return;
}
s.setFilters(FILTRO_NOVE_DIGITOS);
final char[] mascara = ehNoveDigitos(s) ? TELEFONE_NOVE_DIGITOS : TELEFONE_OITO_DIGITOS;
final StringBuilder builder = trataAdicaoRemocaoDeCaracter(s, mascara);
atualizaTexto(validador, resultadoParcial, s, builder);
}
// Verifica se o telefone possui 9 dígitos
private boolean ehNoveDigitos(Editable e) {
return Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(e).replaceAll("").length() > 10;
}
}